package com.dc.refactoring._3_重新组织数据._3_ChangeValueToReference.newObject;

import java.util.HashMap;
import java.util.Map;

/**
 * Description: 将值对象改为引用对象_改造后客户类
 * @author: gdc
 * @date: 2020/11/16
 * @version 1.0
 */
public class Customer {
    private final String name;

    // 【3】通过创建 Map,来保存所有的Customer 对象
    private static final Map<String, Customer> INSTANCES = new HashMap<>();

    // 【1】以工厂函数取代构造函数
    //public static Customer create(String customerName) {
    //    return INSTANCES.get(customerName);
    //}


    // 【5】修改工厂函数名称（由于 create() 总是返回既有的Customer对象 ）
    public static Customer getNamed(String customerName) {
        return INSTANCES.get(customerName);
    }

    // 【2】构造函数声明为 private,以保证所有的对象都是通过工厂函数创建
    private Customer(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    private void store() {
        // 这一步，写的很妙
        INSTANCES.put(this.getName(), this);
    }

    // 【4】当前通过预先创建一部分数据
    public static void loadCustomer() {
        new Customer("LiLe").store();
        new Customer("Nice").store();
        new Customer("Lucy").store();
    }

}
